import java.util.Objects;

class MyArrays {
    public Object[] obj = new Object[3];

    public Object getPos(int pos) {
        return obj[pos];
    }

    public void setPos(Object val,int pos) {
        obj[pos] = val;
    }
}


public class TestDemo {
    //包装类：基本数据类型对应的类类型

    //装箱/装包：把基本类型变为对应的包装类型
    public static void main1(String[] args) {
        int a=10;
        Integer val1 = a;//自动装箱-->底层就是调用的这两个方法：

        Integer val2 = Integer.valueOf(a);//手动装箱
        Integer val3 = new Integer(a);//手动装箱
        String str = "123";
    }

    //拆箱/拆包：将引用类型拆箱为基本数据类型
    public static void main2(String[] args) {
        Integer value1 = 10;//这里自动装箱
        int a = value1;//自动拆箱
        int b = value1.intValue();//手动拆箱
        double c = value1.doubleValue();//(value1是包装类，权限大，转基本类型随便转)
    }

    //一道经典的面试题：
    public static void main3(String[] args) {
        Integer a = 127;
        Integer b = 127;

        Integer c = 128;
        Integer d = 128;

        //底层代码：-128->127
        //        public static Integer valueOf(int i) {
        //            if (i >= Integer.IntegerCache.low && i <= Integer.IntegerCache.high)
        //                return Integer.IntegerCache.cache[i + (-Integer.IntegerCache.low)];
        //            return new Integer(i);
        //        }

        System.out.println(a==b);//true
        System.out.println(c==d);//false
    }


    //泛型
    //1.Object[] obj
    //这种就是什么数据都可以存，但是取的时候就需要强转了，不够好
    public static void main(String[] args) {
        MyArrays myArrays = new MyArrays();
        myArrays.setPos(6,0);
        myArrays.setPos("world",1);
        myArrays.setPos(10.5,2);
        int a = (int)myArrays.getPos(0);
        String str = (String)myArrays.getPos(1);
        double d = (double)myArrays.getPos(2);

        Alg<Integer> alg = new Alg();
        Integer[] array = {5,2,7,100,3,6,9};
        int max = alg.findMax(array);
        System.out.println(max);

    }

    //2.MyArray<Integer> myArray = new MyArray<>();
    //真正的泛型：（编译的时候一种机制）
    //1.存储数据的时候可以帮我们进行自动的类型检查
    //2.获取元素的时候可以帮我们进行类型转换
    //3.规定：泛型当中不能实例化一个泛型类型的数组

    //泛型正确的写法：
    //public EObject[] obj = new Object[3];
    //public E getPos(int pos) {
    //      return (E)obj[pos];
    //}

}

//class MyArray<T> {
//    public EObject[] obj = new Object[3];
//    public T getPos(int pos) {
//        return this.array[pos];
//    }
//    public void setVal(int pos,T val) {
//        this.array[pos] = val;
//    }
//}
//public class TestDemo {
//    public static void main(String[] args) {
//        MyArray<Integer> myArray = new MyArray<>();//2
//        myArray.setVal(0,10);
//        myArray.setVal(1,12);
//        int ret = myArray.getPos(1);//3
//        System.out.println(ret);
//        myArray.setVal(2,"bit");//4
//    }
//}

//代表将来指定的参数类型一定是实现了这个接口的
class Alg<E extends Comparable<E>> {
    public E findMax(E[] array) {
        E max = array[0];
        for (int i = 1; i < array.length; i++) {
            if (max.compareTo(array[i])<0) {
                max = array[i];
            }
        }
        return max;
    }
}
//E是Number的子类或者E是Number本身
class Alg2<E extends Number> {

}
